স্প্রিং বুট (Spring Boot) অ্যাপ্লিকেশন টেস্টিং একটি গুরুত্বপূর্ণ অংশ, যা আমাদের অ্যাপ্লিকেশনের কার্যকারিতা যাচাই করতে সহায়তা করে। স্প্রিং বুটে টেস্টিং করার জন্য বেশ কিছু টুল এবং কৌশল রয়েছে, যার মধ্যে JUnit, Mockito, Spring Boot Test, এবং @DataJpaTest অন্যতম। এই টেস্টিং টুলগুলো ব্যবহার করে আমরা অ্যাপ্লিকেশন এর বিভিন্ন স্তরের (যেমন, ইউনিট টেস্ট, ইন্টিগ্রেশন টেস্ট, রেস্ট API টেস্ট) কার্যকারিতা পরীক্ষা করতে পারি।
স্প্রিং বুট অ্যাপ্লিকেশনে টেস্টিং করার মূল উদ্দেশ্য হল:
- অ্যাপ্লিকেশনের প্রতিটি কম্পোনেন্ট (যেমন সার্ভিস, রেপোজিটরি, কন্ট্রোলার) সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করা।
- বিভিন্ন ধরনের আউটপুট, ইনপুট এবং সিস্টেম বিহেভিয়ার যাচাই করা।
- অ্যাপ্লিকেশনের টেকসই এবং নির্ভরযোগ্যতা নিশ্চিত করা।
এখানে, স্প্রিং বুট টেস্টিং এর কিছু সাধারণ পদ্ধতি এবং উদাহরণ দেওয়া হলো।
১. ইউনিট টেস্ট (Unit Testing) - @SpringBootTest
স্প্রিং বুট অ্যাপ্লিকেশনে ইউনিট টেস্ট করার জন্য @SpringBootTest ব্যবহার করা হয়। এটি পুরো স্প্রিং কনটেক্সট লোড করে এবং অ্যাপ্লিকেশনের যেকোনো বিহেভিয়ার যাচাই করতে সাহায্য করে।
উদাহরণ: সার্ভিস লেয়ার টেস্টিং
ধরা যাক আমাদের একটি UserService ক্লাস আছে, যার মধ্যে একটি মেথড রয়েছে যা ইউজার ডেটা ফেরত দেয়।
@Service
public class UserService {
public String getUserById(Long id) {
return "User" + id; // Simple method returning User name based on ID
}
}
এখন আমরা এটি টেস্ট করব।
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void testGetUserById() {
Long userId = 1L;
String result = userService.getUserById(userId);
assertEquals("User1", result); // Checking if the result is correct
}
}
এখানে:
@SpringBootTest: এটি স্প্রিং বুট কনটেক্সট লোড করে এবং অ্যাপ্লিকেশনের বাস্তব সার্ভিসের সাথে কাজ করতে সহায়তা করে।assertEquals: এটি ইউজারের ইনপুট ও প্রত্যাশিত আউটপুট মিলিয়ে যাচাই করে।
২. ডেটাবেস টেস্টিং (Database Testing) - @DataJpaTest
স্প্রিং বুটের @DataJpaTest অ্যানোটেশনটি শুধুমাত্র JPA রিলেটেড টেস্টিংয়ের জন্য ব্যবহৃত হয়। এটি ডেটাবেস সংক্রান্ত টেস্টিং খুব সহজ করে তোলে এবং একমাত্র JPA বিহেভিয়ার টেস্ট করতে সহায়তা করে।
উদাহরণ: রেপোজিটরি টেস্টিং
ধরা যাক আমাদের একটি UserRepository আছে এবং আমরা একটি ইউজারের ডেটা ডাটাবেসে সেভ করতে চাই।
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
}
এখন, UserRepository টেস্ট করবো।
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import static org.junit.jupiter.api.Assertions.*;
@DataJpaTest
public class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
public void testSaveUser() {
User user = new User();
user.setUsername("JohnDoe");
user.setEmail("john@example.com");
User savedUser = userRepository.save(user);
assertNotNull(savedUser.getId()); // Check if user ID is not null after saving
assertEquals("JohnDoe", savedUser.getUsername()); // Check if the username is correct
}
@Test
public void testFindUserByUsername() {
User user = new User();
user.setUsername("JaneDoe");
user.setEmail("jane@example.com");
userRepository.save(user);
User foundUser = userRepository.findByUsername("JaneDoe");
assertNotNull(foundUser); // Ensure user is found
assertEquals("JaneDoe", foundUser.getUsername()); // Check the username
}
}
এখানে:
@DataJpaTest: এটি শুধুমাত্র JPA সম্পর্কিত টেস্টিংয়ের জন্য ব্যবহার করা হয় এবং ডেটাবেস টেবিল তৈরি ও পরিচালনা করার জন্য H2 ডেটাবেস ব্যবহার করে।assertNotNull,assertEquals: ব্যবহার করা হচ্ছে ইউজারের ডেটা যাচাই করার জন্য।
৩. রেস্ট API টেস্টিং - @WebMvcTest
স্প্রিং বুটে রেস্ট API টেস্ট করার জন্য @WebMvcTest ব্যবহার করা হয়। এটি শুধুমাত্র ওয়েব লেয়ার টেস্ট করে এবং সার্ভিস বা ডেটাবেস লেয়ার লোড করে না।
উদাহরণ: কন্ট্রোলার টেস্টিং
ধরা যাক আমাদের একটি UserController ক্লাস আছে, যা ব্যবহারকারী সম্পর্কিত ডেটা প্রদান করে।
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public ResponseEntity<String> getUser(@PathVariable Long id) {
return ResponseEntity.ok(userService.getUserById(id));
}
}
এখন, UserController টেস্ট করবো।
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
@WebMvcTest(UserController.class)
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testGetUser() throws Exception {
mockMvc.perform(get("/users/1"))
.andExpect(status().isOk()) // Check if status is OK
.andExpect(content().string("User1")); // Check the response content
}
}
এখানে:
@WebMvcTest: এটি শুধুমাত্র ওয়েব লেয়ার টেস্ট করে, সার্ভিস বা ডেটাবেসের বাস্তব কনটেক্সট লোড করে না।MockMvc: এটি HTTP অনুরোধ সিমুলেট করে এবং রেসপন্স যাচাই করার জন্য ব্যবহৃত হয়।andExpect(status().isOk()): রেসপন্স স্ট্যাটাস কোড যাচাই করা হচ্ছে।
৪. মক টেস্টিং (Mock Testing) - @MockBean
যখন আপনি স্প্রিং বুট অ্যাপ্লিকেশনে ডিপেনডেন্সি ইনজেকশন এবং মকিং করতে চান, তখন @MockBean ব্যবহার করা হয়। এটি রেপোজিটরি বা সার্ভিস এর মতো ডিপেনডেন্সি মক করে এবং টেস্টে ফোকাস করা সহজ হয়।
উদাহরণ: মক সার্ভিস টেস্টিং
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.assertEquals;
@SpringBootTest
public class UserServiceMockTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@Test
public void testGetUserById() {
User mockUser = new User();
mockUser.setUsername("MockUser");
Mockito.when(userRepository.findById(1L)).thenReturn(java.util.Optional.of(mockUser));
User user = userService.getUserById(1L);
assertEquals("MockUser", user.getUsername());
}
}
এখানে:
@Mock: এটিUserRepositoryমক করে।@InjectMocks: এটিUserServiceক্লাসে মক ডিপেনডেন্সি ইনজেক্ট করে।
সারাংশ
স্প্রিং বুট টেস্টিং অত্যন্ত গুরুত্বপূর্ণ, যা অ্যাপ্লিকেশনের বিভিন্ন স্তরে কার্যকারিতা নিশ্চিত করে। @SpringBootTest, @DataJpaTest, @WebMvcTest, এবং @MockBean সহ বিভিন্ন টেস্টিং অ্যানোটেশন এবং কৌশল ব্যবহার করে আমরা ইউনিট টেস্ট, ডেটাবেস টেস্ট, রেস্ট API টেস্ট, এবং মক টেস্টিং সহজেই করতে পারি। এসব পদ্ধতির মাধ্যমে অ্যাপ্লিকেশনটি আরও নির্ভরযোগ্য, টেকসই এবং ভুলমুক্ত হয়ে ওঠে।
Read more